
首先,我們需要理解一個基本概念:如果一個字串是另一個字串的排列,那麼這兩個字串中每個字元出現的次數必須完全相同。
基於這個概念,我們可以使用一種稱為「滑動窗口 (Sliding Window)」的方法來解決這個問題。具體來說,假設我們有兩個字串 s1 和 s2,並且 s1 的長度為 。我們可以在 
s2 中遍歷每一個長度為  的子字串,並檢查這個子字串是否與 
s1 有相同的字元組成。
為了實現這一點,我們需要使用一種資料結構(例如 hash table)來記錄每個字元的出現次數。當滑動窗口向右移動時,我們只需要重新計算整個窗口的字元計數,並且逐一扣掉 s1 的字元計數。
最後,我們只需檢查 hash table 中所有字元的計數是否為零。如果是,那麼我們就找到了一個符合條件的子字串,也就是說 s1 是 s2 子字串的一種排列。如果不是,我們就繼續移動滑動窗口,直到遍歷完整個 s2。
別閉門造車,一起準備面試吧!
在紙上呈現100%完美的你!打爆天下無敵手的履歷怎麼寫?找工作前的第一步:履歷健檢!
我們將幫助您撰寫一份出色的履歷表,讓您在眾多求職者中脫穎而出。我們將為您提供專業的建議和指導,幫助您在履歷上呈現最完美的自己。如果心動的話,就別猶豫啦!趕快把握機會,動動手指投遞履歷吧!立即加入 Line 讀書會,和大家一起實現夢想!
履歷諮詢
加入讀書會 (邀請碼:4629)
class Solution {
    fun checkInclusion(s1: String, s2: String): Boolean {
        val s2CharArray = s2.toCharArray()
        for (i in 0..s2.length - s1.length) {
            val table = mutableMapOf<Char, Int>()
            for (j in i until i + s1.length) {
                val char = s2CharArray[j]
                table[char] = (table[char] ?: 0) + 1
            }
            val s1CharArray = s1.toCharArray()
            for (j in s1.indices) {
                val char = s1CharArray[j]
                if (table.containsKey(char)) {
                    table[char] = table[char]!! - 1
                }
            }
            if (table.any { it.value != 0 }) continue
            else return true
        }
        return false
    }
}
時間複雜度:,這裡的 
 和 
 分別代表字串 
s2 和 s1 的長度。這個時間複雜度表示我們需要在 s2 中遍歷所有長度為  的子字串,並對每個子字串進行操作。由於 
s2 的長度為 ,所以我們需要進行 
 次遍歷。而對每個子字串的操作複雜度為 
,所以總的時間複雜度為 
。
空間複雜度:。這裡的 
 代表字元集合,也就是所有可能出現的字元。在這道題目中,字元集合是小寫字母,所以 
。空間複雜度表示我們需要多少額外的空間來存儲資訊。在這裡,我們需要一個 hash table 來記錄每個字元出現的次數,而 hash table 的大小就是字元集合的大小,所以空間複雜度為 
。
別閉門造車,一起準備面試吧!
在紙上呈現100%完美的你!打爆天下無敵手的履歷怎麼寫?找工作前的第一步:履歷健檢!
履歷諮詢
加入讀書會 (邀請碼:4629)